package com.gollum.jpa.util;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * <pre>反射工具类 </pre>
 *
 * @author Herther
 * @version 1.0.0
 * @createTime 2022年08月20日 21:22:00
 */
public class ReflectionUtils extends org.springframework.util.ReflectionUtils {

    /**
     * 功能描述: 找到类所有字段包括父类的集合
     *
     * @param: 类Class
     * @return: 类所有字段的集合
     * @auther: Herther
     * @version 1.0.0
     * @date: 2022/7/16 23:20
     */
    public static List<Field> getAllFieldsWithRoot(Class<?> clazz) {
        List<Field> fieldList = new ArrayList<>();
        Field[] fields = clazz.getDeclaredFields();
        if (fields.length != 0) {
            fieldList.addAll(Arrays.asList(fields));
        }
        Class<?> superclass = clazz.getSuperclass();
        // 如果父类是Object, 直接返回
        if (superclass == Object.class) {
            return fieldList;
        }
        // 递归获取所有的父级的Field
        List<Field> superClassFieldList = getAllFieldsWithRoot(superclass);
        if (!superClassFieldList.isEmpty()) {
            superClassFieldList.stream()
                    // 去除重复字段
                    .filter(field -> !fieldList.contains(field))
                    .filter(field -> !field.getName().equals("createTime"))
                    .filter(field -> !field.getName().equals("createBy"))
                    .filter(field -> !field.getName().equals("updateTime"))
                    .filter(field -> !field.getName().equals("updateBy"))
                    .filter(field -> !field.getName().equals("hasDel"))
                    .filter(field -> !field.getName().equals("serialVersionUID"))
                    .forEach(fieldList::add);
        }
        return fieldList;
    }
}
